package com.backend.modules.task.service;

import com.backend.modules.task.dto.TaskDTO;
import com.backend.modules.task.dto.TaskQueryDTO;
import com.backend.modules.task.entity.Task;
import com.backend.modules.task.vo.TaskStatisticsVO;
import com.backend.modules.task.vo.TaskSubmissionDetailVO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.IOUtils;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 任务管理服务接口
 */
public interface TaskService {
    
    /**
     * 创建任务
     * @param dto 任务参数
     */
    void create(TaskDTO dto);
    
    /**
     * 更新任务
     * @param id 任务ID
     * @param dto 任务参数
     */
    void update(Long id, TaskDTO dto);
    
    /**
     * 删除任务
     * @param id 任务ID
     */
    void delete(Long id);
    
    /**
     * 获取任务详情
     * @param id 任务ID
     * @return 任务实体
     */
    Task getById(Long id);
    
    /**
     * 分页查询任务
     * @param query 查询参数
     * @param pageable 分页参数
     * @return 任务分页结果
     */
    Page<Task> page(TaskQueryDTO query, Pageable pageable);
    
    /**
     * 获取任务提交统计
     * @param taskId 任务ID
     * @return 统计信息
     */
    TaskStatisticsVO getStatistics(Long taskId);

    /**
     * 分页查询任务提交记录
     */
    Page<TaskSubmissionDetailVO> getSubmissions(Long taskId, String studentName, 
        Boolean isLate, Pageable pageable);

    /**
     * 导出提交记录
     */
    void exportSubmissions(Long taskId, HttpServletResponse response) throws IOException;

    /**
     * 批量删除任务
     */
    void batchDelete(List<Long> ids);

    /**
     * 导出已提交文件列表
     */
    ResponseEntity<byte[]> exportSubmittedFiles(Long taskId);

    /**
     * 导出未提交学生名单
     */
    ResponseEntity<byte[]> exportUnsubmittedStudents(Long taskId);

    /**
     * 将任务的所有提交文件打包成ZIP
     * @param taskId 任务ID
     * @param outputStream 输出流
     */
    void exportSubmittedFilesAsZip(Long taskId, OutputStream outputStream) throws IOException;
} 